import requests
from lxml import etree
import re
import os
import time

headers = {
    'User-Agent': 'Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}

search = input('你想要的女朋友是御姐还是萝莉？？？或者其他类型~~~ ：  ')
url = 'https://www.tianshimeitu.com/?s=' + search
search_page = requests.get(url, headers=headers).content.decode('utf-8')
search_page = etree.HTML(search_page)
# 用Xpath得到搜索结果个数，strip()去掉两边的空格
search_res = search_page.xpath('//*[@id="breadcrumbs"]/div/text()')[0].strip()
# 用Xpath获得搜索页的图集URL地址
search_urls = search_page.xpath(
    '//*[@id="main-wrap-left"]/div[1]/article/a/@href')
print(search_res)
print(search_urls)

for urls in search_urls:
    res = requests.get(urls, headers=headers).content.decode('utf-8')
    # 由于网站总的有3种方式，，，，免费，付费，积分？？
    # 用了两种方式表示总的图片数
    # 第一种，付费模式,,,第二种，积分吗？？
    # 第一种直接给出字符串，所以我用正则方式找到出图集共包含多少张图片
    totle = re.findall('本套图共 (.*?) 张', res)
    try:
        if len(totle) != 0:  # 判断能够从字符串中找出总图片数
            totle = totle[0]
            res = etree.HTML(res)
            # 用Xpath查找出第二张图片的URL，第一种网页把第一张放在了第二个img的位置
            fristpic_url = res.xpath(
                '//*[@id="main-wrap-left"]/div[1]/div[3]/p[1]/img[2]/@src')[0]
        else:  # 如果第一种找不到，那就是第二种积分的
            res = etree.HTML(res)
            # 第二种是单独用一个span括起来的，我就用Xpath方式得到
            totle = res.xpath(
                '//*[@id="main-wrap-left"]/div[1]/div[3]/div[1]/span[2]/text()')[0]
            # 查找出第一张图片的URL，第二种网页直接把第一张放在了开头
            fristpic_url = res.xpath(
                '//*[@id="main-wrap-left"]/div[1]/div[3]/img[1]/@src')[0]
        # 找出第一张图片的ID
        first_ID = re.findall('/raw/master/img/(.*?).jpg', fristpic_url)[0]
        # 最后一张图片的ID就用第一张图片的ID加上之前找到的总的图片数量，，呵呵呵
        last_ID = int(first_ID) + int(totle)
        # 这里由于有些图集的URL前缀不一致，所以我从开头截取到最后一个斜杠的位置，得到URL前缀
        fristpic_url = fristpic_url[0:fristpic_url.rfind('/', 1) + 1]
    except:  # 第三种免费的，直接就能找到URL，我就难得写了
        print('本图集免费，自己去保存！我是不会下载的 @_@!')
    title = res.xpath('/html/head/title/text()')[0]  # 找出图集的名称
    print('_AoA_' * 100)
    print(title)
    print('总图片数：' + str(totle))

# 创建图集目录
    path = 'D:\\backup\\pic\\{}\\{}'.format(search, title)  # 设置输出文件夹
    if not os.path.exists(path):  # 判断文件夹不存在
        os.makedirs(path)  # 不存在则建立文件夹
        print('目录创建完成(*^v^*)，记得设置为隐私文件哦^_^!')
    else:
        print('目录已创建(－o_)=3！！，一看就是老绅士了')

# 开始下载图片
    for i in range(int(first_ID), int(last_ID)):  # 让程序在第一个ID雨最后一个ID中遍历，就得到了整个图集的图片地址了
        if os.path.exists('%s\%s.jpg' % (path, i)):  # 判断图片存在于本地，就不重复下载
            print('图片 %s.jpg 已下载' % i)
        else:  # 不存在就下载
            picurl = fristpic_url + str(i) + '.jpg'  # 把地址前缀与图片ID拼接起来
            print('(≧^.^≦)喵~~~正在下载：' + picurl)
            pic = requests.get(picurl).content
            with open('%s\%s.jpg' % (path, i), 'wb') as f:
                f.write(pic)
    print(title + '\n下载完成！\n\n')
    # 设置一下延迟呢，我在跑的时候与服务器链接异常，不过这网站好像有反扒机制
    time.sleep(3)
